package thread;

/**
 * @User: vitobo
 * @Date: 2024-07-29
 * @Description: 案例: 单线程和多线程的区别
 *
 *  并发执行, 多线程可以更充分的利用到多核心的cpu资源;
 *
 *  并发执行不是串行执行花费时间的一半:
 *      t1和t2在执行的过程中, 会经历很多次的调度; 这些次调度, 有时候并发执行的(一个核心上),有些是并行执行的(两个核心上)
 *      另一方面, 线程调度自身也是有时间消耗的;
 */

public class ThreadDemo12 {
    public static void main(String[] args) {
        // 两个变量, 两个变量各自自增1000w次 (CPU密集型)

        //serial();
        concurrency();
    }

    // 并发执行
    public static void concurrency(){

        Thread t1 = new Thread(()->{
            long a = 0;
            for (long i = 0; i < 100_0000_0000L; i++) {
                a++;
            }
        });

        Thread t2 = new Thread(()->{
            long b = 0;
            for (long i = 0; i < 100_0000_0000L; i++) {
                b++;
            }
        });
        // 开始计时
        long begin = System.currentTimeMillis();
        t1.start();
        t2.start();

        // 保证t1, t2执行完之后, 再进行计时
        try {
            t1.join();
            t2.join();
        }catch(InterruptedException e){
            e.printStackTrace();
        }
        // 结束计时
        long end = System.currentTimeMillis();
        System.out.println("并发执行时间: " + (end-begin) + " ms");
    }

    // 串行执行, 一个线程完成
    public static void serial(){
        long begin = System.currentTimeMillis();
        long a = 0;
        for (long i = 0; i < 100_0000_0000L; i++) {
            a++;
        }
        long b = 0;
        for (long i = 0; i < 100_0000_0000L; i++) {
            b++;
        }
        long end = System.currentTimeMillis();
        System.out.println("串行执行,执行时间: " + (end-begin) + "ms");
    }
}
